// 保存文件到应用私有文档目录 (_doc)
// 参数说明：
// data: 要保存的data数据
// append: 是否追加内容（默认false覆盖写入）
export function saveFile(data, append = false) {
    return new Promise((resolve, reject) => {
        if (!data) return reject(new Error("EMPTY_DATA"));

        const jsonData = { time: new Date(), data };
        const content = JSON.stringify(jsonData);
        const fileName = "token.txt";
        const basePath = plus.io.convertLocalFileSystemURL("_doc") + "/";
        const filePath = basePath + fileName;

        // 1. 确保目录存在
        plus.io.resolveLocalFileSystemURL(
            basePath,
            () => createOrWriteFile(), // 目录存在，直接操作文件
            (dirError) => {
                if (dirError.code === 404) {
                    createDirectory().then(createOrWriteFile).catch(reject);
                } else {
                    reject(new Error(`DIR_RESOLVE_FAIL: ${dirError.message}`));
                }
            }
        );

        // 2. 创建目录函数
        function createDirectory() {
            return new Promise((resolve, reject) => {
                plus.io.requestFileSystem(plus.io.PRIVATE_DOC, (fs) => {
                    fs.root.getDirectory("_doc", { create: true },
                        () => resolve(), // 目录创建成功
                        (e) => reject(new Error(`DIR_CREATE_FAIL: ${e.message}`))
                    );
                }, (fsError) => reject(new Error(`FS_REQUEST_FAIL: ${fsError.message}`)));
            });
        }

        // 3. 创建文件并写入
        function createOrWriteFile() {
            plus.io.resolveLocalFileSystemURL(
                basePath,
                (dirEntry) => {
                    dirEntry.getFile(
                        fileName,
                        { create: true }, // 关键：文件不存在则自动创建
                        (fileEntry) => writeContent(fileEntry),
                        (fileError) => reject(new Error(`FILE_ACCESS_FAIL: ${fileError.message}`))
                    );
                },
                (dirError) => reject(new Error(`DIR_ACCESS_FAIL: ${dirError.message}`))
            );
        }

        // 4. 写入内容
        function writeContent(fileEntry) {
            fileEntry.createWriter((writer) => {
                writer.seek(append ? writer.length : 0); // 追加/覆盖
                writer.onwrite = () => resolve(filePath); // 写入成功
                writer.onerror = (e) => reject(new Error(`WRITE_FAIL: ${e.target.error}`));
                writer.write(content);
            }, (writerError) => reject(new Error(`WRITER_CREATE_FAIL: ${writerError.message}`)));
        }
    });
}

// 从 _doc 目录异步读取文件（返回Promise）
export function readFile() {
    return new Promise((resolve, reject) => {
        const fileName = "token.txt";
        const filePath = plus.io.convertLocalFileSystemURL("_doc/" + fileName);
        plus.io.resolveLocalFileSystemURL(filePath, (entry) => {
            entry.file((file) => {
                const reader = new plus.io.FileReader();
                reader.onloadend = (e) => {
                    try {
                        const content = e.target.result;
                        const jsonData = JSON.parse(content); // 解析JSON
                        const daysDiff = getDaysFromNow(jsonData.time)
                        const day = jsonData.data.result.userInfo.userTokenTime / 3600 / 24
                        console.log(daysDiff, day)
                        if (daysDiff > day) {
                            clearFileContent()
                        } else {
                            resolve(jsonData); // 返回解析后的数据
                        }
                    } catch (e) {
                        reject(new Error("文件解析失败: " + e.message)); // JSON格式错误
                    }
                };
                reader.onerror = (e) => {
                    reject(new Error("文件读取失败: " + e.target.error.code));
                };
                reader.readAsText(file, "utf-8");
            }, (err) => reject(new Error("文件操作失败: " + err.message)));
        }, (err) => {
            if (err.code === 1) {
                reject(new Error("文件不存在")); // 明确提示文件不存在
            } else {
                reject(new Error("系统错误: " + err.message));
            }
        });
    });
}


// 清空单个缓存文件
export function clearFileContent() {
    const fileName = "token.txt";
    const filePath = plus.io.convertLocalFileSystemURL("_doc/" + fileName);

    plus.io.resolveLocalFileSystemURL(filePath, (entry) => {
        entry.createWriter((writer) => {
            // 核心修改：使用截断操作清空内容
            writer.truncate(0);  // 关键操作：将文件截断为0字节[7,8](@ref)

            // 监听写入完成事件
            writer.onwrite = () => console.log("文件内容已清空");

            // 错误处理
            writer.onerror = (e) => {
                console.error("清空失败", e.target.error);
                // 尝试创建新文件（当文件损坏时）
                plus.io.resolveLocalFileSystemURL("_doc/", (dir) => {
                    dir.getFile(fileName, {create: true}, () => {
                        console.log("已创建新空文件");
                    });
                });
            };
        }, (createWriterError) => {
            console.error("创建写入器失败", createWriterError);
        });
    }, (err) => {
        // 增强错误处理
        if (err.code === 1) {
            console.error("文件不存在");
        } else {
            console.error("文件访问错误", err);
        }
    });
}


// 计算指定日期距离当前时间的天数（支持正/负值）
function getDaysFromNow(nowTime, precise = false) {
    try {
        const now = new Date(nowTime);
        const target = new Date();
        // 时区校准（若为UTC时间）
        const isUTC = nowTime.endsWith("Z");
        if (isUTC) {
            now.setMinutes(now.getMinutes() - now.getTimezoneOffset());
        }
        const diffMs = target - now;
        if (precise) {
            return (diffMs / (1000 * 60 * 60 * 24)).toFixed(2);
        }
        return Math.round(diffMs / (1000 * 60 * 60 * 24));
    } catch (e) {
        console.error("日期计算失败:", e.message);
        return null;
    }
}